package concesionario.source;

import java.util.ArrayList;
import java.util.List;
import java.io.*;

public class Concesionario{

  private  List<Coche> almacen;
  private  List<Exposicion> expo;
  private  List<Cliente> cte;
  private  List<VendedoraComision> vCom;
  private  List<Coche> registroVendido;
  private int numExpo;
 
  
  //Añadir y Eliminar coches en el nuestro almacen concesionario.
  public Concesionario(){
  
      this.almacen=new ArrayList<Coche>();
      this.expo=new ArrayList<Exposicion>();
      this.cte=new ArrayList<Cliente>();
      this.vCom=new ArrayList<VendedoraComision>();
      this.registroVendido=new ArrayList<Coche>();
      this.numExpo=0;
  }
  
  //métodos Get
  
  public int getSizeVendidos(){
  
      return this.registroVendido.size();
  
  } 
  public void anadiraVendidos(Coche c){
  
      this.registroVendido.add(c);
  
  }
  
  
  public Coche getCoche(int i){
        return this.almacen.get(i);
    }
   public int getSizeAlmacen(){
       return this.almacen.size();
   }
   
   public Coche getCoche(String ma){
   
       boolean encontrado=false;
       int i=0;
       
       while(i<almacen.size() && !encontrado){
           
           encontrado=almacen.get(i).getMatricula().equals(ma);
           if(!encontrado)
               i++;
       }
       if(encontrado){
           return almacen.get(i);
       
       }else
           throw new IllegalArgumentException();
   
   }
  
  //Método añadir un Coche
   
   
  public void anadirCoche(Coche c){
  
    almacen.add(c);
    
  }
  
  //Método eliminar un coche por su matricula.
  
  public void eliminarCoche(String ma){
  
    //busqueda por matricula para borrar un coche.
    boolean encontrado=false;
    int i=0;
    
    while(i<almacen.size() && !encontrado){
        encontrado=almacen.get(i).getMatricula().equals(ma);
        if(!encontrado)
            i++;
    }   
    if(encontrado){
        almacen.remove(i);
    }
  
  }
  
  //Métodos Modificar Coche
  
  public void modificarMarca(int i, String marca){
      
    almacen.get(i).setMarca(marca);  
  }
  
  public void modificarModelo(int i, String modelo){
      
    almacen.get(i).setModelo(modelo);  
  }
  public void modificarMatricula(int i, String matricula){
      
    almacen.get(i).setMatricula(matricula);  
  }
  public void modificarPC(int i, double pC){
      
    almacen.get(i).setPrecioCompra(pC);  
  }
  public void modificarPV(int i, double pV){
      
    almacen.get(i).setPrecioVenta(pV);  
  }
  public void modificarEstado(int i, String est){
      
    almacen.get(i).setEstado(est);  
  }
  
  //Mostrar los coches almacenados en el concesionario.
   
   //EXPOSICIÓN.
   
   //Mover de exposición.
  
  
  public void cambiarExposicion(Coche c,Exposicion expo){
  
      c.moverExposicion(expo);
  }
  
  public void anadirExpo(Exposicion e){
      numExpo++;
      e.setNumeroExpo(numExpo);
      expo.add(e);
    
  }
  
  //Método eliminar por su nombre de exposición.
  
  public void eliminarExpo(int num){
  
    //busqueda por nombre para borrar una exposicion.
    boolean encontrado=false;
    int i=0;
    
    
    while(i<expo.size() && !encontrado){
        encontrado=expo.get(i).getNumeroExpo()==num;
        if(!encontrado)
            i++;
    }   
    if(encontrado){
        expo.remove(i);
    }
  
  }
  //Tamaño del array exposciones.
  
  public Exposicion getExpo(int i){   
    
        return this.expo.get(i);
    
  }
  public int getSizeExposicion(){
 
      return this.expo.size();
  
  
  }
  public Exposicion getExpoNumero(int num){
   
       boolean encontrado=false;
       int i=0;
       
       while(i<expo.size() && !encontrado){
           
           encontrado=expo.get(i).getNumeroExpo()==num;
           if(!encontrado)
               i++;
       }
       if(encontrado){
           return expo.get(i);
       
       }else
           throw new IllegalArgumentException();
   
   }
  
  
  //VENDEDOR A COMISION
  
  public void anadirVCom(VendedoraComision v){
      
        this.vCom.add(v);    
  }
  
  //Método eliminar por su DNI.
  
  public void eliminarVCom(String dniVCom){
  
    //busqueda por su DNI.
    boolean encontrado=false;
    int i=0;
    
    
    while(i<vCom.size() && !encontrado){
        encontrado=vCom.get(i).getDNI().equals(dniVCom);
        if(!encontrado)
            i++;
    }   
    if(encontrado){
        vCom.remove(i);
    }
  
  }
  public VendedoraComision getVCom(int i){
        return this.vCom.get(i);
    }
   public int getSizeVCom(){
       return this.vCom.size();
   }
   public VendedoraComision getVCom(String dniVCom){
   
       boolean encontrado=false;
       int i=0;
       
       while(i<vCom.size() && !encontrado){
           encontrado=vCom.get(i).getDNI().equals(dniVCom);
           if(!encontrado)
               i++;
       }
       if(encontrado){
           return vCom.get(i);
       
       }else
           throw new IllegalArgumentException();
   
   }
   
   
   //CLIENTE.
   
   
   public void anadirCliente(Cliente cl){
      
        this.cte.add(cl);    
  }
  
  //Método eliminarCliente,sólo se podrá eliminar si no tiene ningún: 
   // coche comprado ni coche reservado
  
  public void eliminarCliente(String dniCl) throws IllegalArgumentException{
  
   
    boolean encontrado=false;
    int i=0;
    
    
    while(i<cte.size() && !encontrado){
        encontrado=cte.get(i).getDNI().equals(dniCl);
        if(!encontrado)
            i++;
    }   
    if(encontrado && cte.get(i).cocheNoCompradoCliente() && cte.get(i).cocheNoReservadoCliente()){
        cte.remove(i);
    } else {
        if(!cte.get(i).cocheNoCompradoCliente() || !cte.get(i).cocheNoReservadoCliente()){
            throw new IllegalArgumentException();
        }
    }
  } 
   public Cliente getCliente(int i){
        return this.cte.get(i);
    }
   public int getSizeCliente(){
       return this.cte.size();
   }
   
   public Cliente getCliente(String dniCl){
   
       boolean encontrado=false;
       int i=0;
       
       while(i<cte.size() && !encontrado){
           encontrado=cte.get(i).getDNI().equals(dniCl);
           if(!encontrado)
               i++;
       }
       if(encontrado){
           return cte.get(i);
       
       }else
           throw new IllegalArgumentException();
   
   }
   public void reservarCoche(String ma){
        
       
      if(!this.getCoche(ma).buscarenReserva()){  
        
      //cambiamos el estado a enReserva.
      
        this.getCoche(ma).setEstado(Coche.EN_RES);
        
      }else{
          
          throw new IllegalArgumentException();
   
      } 
    }
   public void cancelarReserva(String ma,String dniCl){
   
       if(this.getCoche(ma).buscarenReserva()){
       
           this.getCoche(ma).setEstado(Coche.EN_VNT);
           this.getCliente(dniCl).EliminarCocheReservado(this.getCoche(ma));
       }else{
       
           throw new IllegalArgumentException();
       }
   }
    
    public void venderCoche(String ma){
        this.getCoche(ma).setEstado(Coche.EN_VDD);   
    }
    public void reservarCocheCliente(String ma,String dniCl){
    
        this.reservarCoche(ma);
        this.getCliente(dniCl).AgregarCocheReservado(this.getCoche(ma));
    
    }
    public Coche getClienteComprado(String ma){
   
       boolean encontrado=false;
       int i=0;
       
       while(i<this.registroVendido.size() && !encontrado){
           encontrado=this.registroVendido.get(i).getMatricula().equals(ma);
           if(!encontrado)
               i++;
       }
       if(encontrado){
           return this.registroVendido.get(i);
       
       }else
           throw new IllegalArgumentException();
   
   }
    public Coche getCocheVendido(int i){
    
        return this.registroVendido.get(i);
    
    }
    public Cliente devolverCliente(String ma){

        return this.getCliente(this.getClienteComprado(ma).getDniComprador());

    }
    public void venderCocheCliente(String ma,String dniCl,String dniVCom){
    
       
        this.venderCoche(ma);
        this.getCliente(dniCl).AgregarCocheComprado(this.getCoche(ma));
        this.getCoche(ma).setDniComprador(dniCl);
        this.anadiraVendidos(this.getCoche(ma));
        this.getVCom(dniVCom).AgregarCocheVendido(this.getCoche(ma));
        this.almacen.remove(this.getCoche(ma));
    }
   
    //FICHERO DE COCHES EN VENTA
  
   public void ficheroCochesenVenta(String ruta){
  
      
      FileWriter fichero = null;
      PrintWriter pw = null;
      
        try
        {
            fichero = new FileWriter(ruta);
            pw = new PrintWriter(fichero);
            
            //comprobar,no realizado correctamente
                for(int i=0;i<=almacen.size();i++)
                    if(this.getCoche(i).getEstado().equals(Coche.EN_VNT))
                        pw.print(this.getCoche(i)+"\r\n");

        } catch (Exception e) {
            //e.printStackTrace();
        } finally {
           try {
           // Nuevamente aprovechamos el finally para 
           // asegurarnos que se cierra el fichero.
           if (null != fichero)
              fichero.close();
           } catch (Exception e2) {
              //e2.printStackTrace();
           }
        }
    
   }
   
   //FICHEROS
   
   public void escribirVendidos(File r) throws IOException{
   
       File ruta=new File(r+"/vendidos.dat");
       
       FileOutputStream vendidos=new FileOutputStream(ruta);
       
       ObjectOutputStream oVendidos=new ObjectOutputStream(vendidos);
       
       for (int i=0; i<this.registroVendido.size(); i++) {
            oVendidos.writeObject(this.registroVendido.get(i));    
       }
       oVendidos.close();
       
   }
   

   public void escribirCoches(File r) throws IOException{
   
       File ruta=new File(r+"/coches.dat");
       
       FileOutputStream coches=new FileOutputStream(ruta);
       
       ObjectOutputStream oCoches=new ObjectOutputStream(coches);
       
       for (int i=0; i<this.almacen.size(); i++) {
            oCoches.writeObject(this.almacen.get(i));    
       }
       oCoches.close();
       
   }
   
   
   public void escribirVCom(File r) throws IOException{
   
       File ruta=new File(r+"/vCom.dat");
       
       FileOutputStream vComision=new FileOutputStream(ruta);
       
       ObjectOutputStream oVCom=new ObjectOutputStream(vComision);
       for (int i=0; i<this.vCom.size(); i++) {
            oVCom.writeObject(this.vCom.get(i));    
       }
       oVCom.close();
       
   }
   public void escribirCliente(File r) throws IOException{
   
       File ruta=new File(r+"/cliente.dat");
       
       FileOutputStream cliente=new FileOutputStream(ruta);
       
       ObjectOutputStream oCte=new ObjectOutputStream(cliente);
       for (int i=0; i<this.cte.size(); i++) {
            oCte.writeObject(this.cte.get(i));    
       }
       oCte.close();
       
   }
   public void escribirExpo(File r) throws IOException{
   
       File ruta=new File(r+"/expo.dat");
       
       FileOutputStream exposicion=new FileOutputStream(ruta);
       
       ObjectOutputStream oExpo=new ObjectOutputStream(exposicion);
       for (int i=0; i<this.expo.size(); i++) {
            oExpo.writeObject(this.expo.get(i));    
       }
       oExpo.close();
       
   }
   
   public void cargarVendidos(File r,int vendidosSize) throws IOException, ClassNotFoundException{
   
       File ruta=new File(r+"/vendidos.dat");
       
       FileInputStream vendidos=new FileInputStream(ruta);
       
       ObjectInputStream oVendidos=new ObjectInputStream(vendidos);
       
       int i=0;
       while (i<vendidosSize) {
           this.registroVendido.add((Coche)oVendidos.readObject());
           i++;
       }
       oVendidos.close();
   }
   public void cargarCoches(File r,int cochesSize) throws IOException, ClassNotFoundException{
   
       File ruta=new File(r+"/coches.dat");
       
       FileInputStream coches=new FileInputStream(ruta);
       
       ObjectInputStream oCoches=new ObjectInputStream(coches);
       
       int i=0;
       while (i<cochesSize) {
           this.almacen.add((Coche)oCoches.readObject());
           i++;
       }
       oCoches.close();
   }
   public void cargarVCom(File r,int vComSize) throws IOException, ClassNotFoundException{
   
       File ruta=new File(r+"/vCom.dat");
       
       FileInputStream vComisiones=new FileInputStream(ruta);
       
       ObjectInputStream oVCom=new ObjectInputStream(vComisiones);
       int i=0;
       while (i<vComSize) {
            this.vCom.add((VendedoraComision)oVCom.readObject());
            i++;
       }
       oVCom.close();
   }
   public void cargarCliente(File r,int clienteSize) throws IOException, ClassNotFoundException{
   
       File ruta=new File(r+"/cliente.dat");
       
       FileInputStream cliente=new FileInputStream(ruta);
       
       ObjectInputStream oCte=new ObjectInputStream(cliente);
       int i=0;
       while (i<clienteSize) {
            this.cte.add((Cliente)oCte.readObject());
            i++;
       }
       oCte.close();
   }
    public void cargarExpo(File r,int expoSize) throws IOException, ClassNotFoundException{
   
       File ruta=new File(r+"/expo.dat");
       
       FileInputStream exposicion=new FileInputStream(ruta);
       
       ObjectInputStream oExpo=new ObjectInputStream(exposicion);
       int i=0;
       while (i<expoSize) {
            this.expo.add((Exposicion)oExpo.readObject());
            i++;
       }
       oExpo.close();
   }
   
   public void cargar(File r) throws IOException, ClassNotFoundException{
       File ruta=new File(r+"/sizes.dat");
       FileInputStream sizes=new FileInputStream(ruta); 
       ObjectInputStream oSizes=new ObjectInputStream(sizes);
       
       this.cargarCoches(r,(Integer)oSizes.readObject());
       
       this.cargarVCom(r,(Integer)oSizes.readObject());
       
       this.cargarCliente(r,(Integer)oSizes.readObject());
       
       this.cargarExpo(r,(Integer)oSizes.readObject());
       
       this.cargarVendidos(r,(Integer)oSizes.readObject());
   }
   
   public void guardar(File r) throws IOException{
       File ruta=new File(r+"/sizes.dat");
       FileOutputStream sizes=new FileOutputStream(ruta); 
       ObjectOutputStream oSizes=new ObjectOutputStream(sizes);
       oSizes.writeObject(this.almacen.size());
       oSizes.writeObject(this.vCom.size());
       oSizes.writeObject(this.cte.size());
       oSizes.writeObject(this.expo.size());
       oSizes.writeObject(this.registroVendido.size());
       oSizes.close();
       
       this.escribirCoches(r);
       this.escribirCliente(r);
       this.escribirExpo(r);
       this.escribirVCom(r);
       this.escribirVendidos(r);
   }
  
  }
 
   
   
 

